package designpatterns.obsever.code;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 气象部门
 */
public class WeatherServer implements Subject {
    // 注册到气象部门的观察者
    private List<Observer> observers = new CopyOnWriteArrayList();;
    @Override
    public void register(Observer observer) {
        observers.add(observer);
        System.out.println("新注册一个观察者,"+observer.getClass().getSimpleName());
    }

    /**
     * 天气变更了,通知观察者们
     */
    @Override
    public void notifyAllObservers(WeatherChangeEvent event) {
        for (Observer observer : observers) {
            try {
                observer.update(event);
            } catch (Exception e) {
                System.out.println("通知观察者失败:" +observer.getClass().getSimpleName()+"err="+ e.getMessage());
//                // 在通知一次
//                try {
//                    System.out.println("通知观察者失败:" +observer.getClass().getSimpleName()+"err="+ e.getMessage());
//                    observer.update(event);
//                } catch (Exception ex) {
//                    // 异常该观察者
//                    System.out.println("再次通知观察者失败 移除该观察者:" +observer.getClass().getSimpleName()+"err="+ e.getMessage());
//                    remove(observer);
//                }
            }
        }
    }

    @Override
    public void remove(Observer observer) {
        if (observers.contains(observer)) {
            observers.remove(observer);
            System.out.println("注销一个观察者,"+observer.getClass().getSimpleName());
        }
    }
}
